package reflection;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 反射练习
 */
public class ReflectionExercise01 {


    public static void main(String[] args) throws Exception {
        /*
        通过反射修改私有成员变量

        1.定义PrivateTest类，有私有name属性，并且属性值为hellokitty
        2.定义getName的公有方法
        3.创建PrivateTest的类，利用Class类得到私有的name属性，修改私有的name属性值
          并调用getName()的方法打印属性值
        */

        Class<PrivateTest> cls = PrivateTest.class;
        PrivateTest privateTest = cls.newInstance();

        Field nameFiled = cls.getDeclaredField("name");
        nameFiled.setAccessible(true);  //私有属性需要取消访问检查
        nameFiled.set(privateTest, "天龙八部");

        Method getNameMethod = cls.getMethod("getName");
        Object invoke = getNameMethod.invoke(privateTest);
        System.out.println("name属性值=" + invoke);    //天龙八部

    }
}

class PrivateTest {

    private String name = "hellokitty";

    public PrivateTest() {
    }

    public PrivateTest(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "PrivateTest{" +
                "name='" + name + '\'' +
                '}';
    }
}